#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


//int cmp(const void* e1, const void* e2)
//{
//	return (*(int*)e1 - *(int*)e2);
//}
//
//void swap(char* buf1, char* buf2, int width)
//{
//	for (int i = 0; i < width; i++)
//	{
//		int tmp = *buf1;
//		*buf1 = *buf2;
//		*buf1 = tmp;
//		buf1++;
//		buf2++;
//	}
//}
//
//void bubbule(void* base, int num, int width, int(*cmp)(const void* e1, const void* e2))
//{
//	for (int i = 0; i < num-1; i++)
//	{
//		int j = 0;
//		for (j; j < num - 1 - i; j++)
//		{
//			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width)>0)
//			{
//				swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
//			}
//		}
//	}
//}
//
//void print_arr(void* base, int num)
//{
//	for (int i = 0; i < num; i++)
//	{
//		printf("%d ", *((int*)base + i));
//	}
//}
//
//int main()
//{
//	int arr[] = { 10,9,8,7,6,5,4,3,2,1,0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bubbule(arr, sz, sizeof(arr[0]), cmp);
//	print_arr(arr, sz);
//	return 0;
//}

//练习使用库函数，qsort排序各种类型的数据

//int cmp_int(const void* e1, const* e2)
//{
//	return (*(int*)e1 - *(int*)e2);
//}
//
//void print_arr(void* base, int num)
//{
//	for (int i = 0; i < num; i++)
//	{
//		printf("%d ", *((int*)base + i));
//	}
//	printf("\n");
//}
//
//void test1()
//{
//	int arr[] = { 10,9,8,7,6,5,4,3,2,1,0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, sz, sizeof(arr[0]), cmp_int);
//	print_arr(arr, sz);
//}
//
//struct stu
//{
//	char name[10];
//	int age;
//	double score;
//};
//
//int cmp_stu_name(const void* e1, const void* e2)
//{
//	return (strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name));
//}
//
//int cmp_stu_age(const void* e1, const void* e2)
//{
//	return (((struct stu*)e1)->age-((struct stu*)e2)->age);
//}
//
//void print_stu_name(void* base, int num)
//{
//	for (int i = 0; i < num; i++)
//	{
//		printf("%s ", ((struct stu*)base+i)->name);
//	}
//	printf("\n");
//}
//
//void print_stu_age(void* base, int num)
//{
//	for (int i = 0; i < num; i++)
//	{
//		printf("%d ", ((struct stu*)base + i)->age);
//	}
//	printf("\n");
//}
//
//void test2()
//{
//	struct stu s1[3] = { {"liming",18,40.0},{"wangwu",15,30.5},{"lanxin",20,88.0} };
//	int sz = sizeof(s1) / sizeof(s1[0]);
//	qsort(s1, sz, sizeof(s1[0]), cmp_stu_name);
//	print_stu_name(s1, sz);
//	qsort(s1, sz, sizeof(s1[0]), cmp_stu_age);
//	print_stu_age(s1, sz);
//}
//
//int cmp_char(const void* e1, const void* e2)
//{
//	return (*(char*)e1 - *(char*)e2);
//}
//
//void print_char_name(void* base, int num)
//{
//	for (int i = 0; i < num; i++)
//	{
//		printf("%c ", *((char*)base + i));
//	}
//	printf("\n");
//}
//
//void test3()
//{
//	char arr2[] = { 'e','d','c','b','a' };
//	int sz = sizeof(arr2) / sizeof(arr2[0]);
//	qsort(arr2, sz, sizeof(arr2[0]), cmp_char);
//	print_char_name(arr2, sz);
//}
//
//int main()
//{
//	test1();
//	test2();
//	test3();
//	return 0;
//}

//
//int main()
//{
//	int a[] = { 1,2,3,4 };
//	//          0 1 2 3
//	int(*p)[4] = &a;
//
//	printf("%d\n", sizeof(a));//4*4 = 16
//	printf("%d\n", sizeof(a + 0));//4/8 a+0是数组第一个元素的地址，是地址，大小就是4/8个字节
//	printf("%d\n", sizeof(*a)); //4 a表示数组首元素的地址，*a表示数组的第一个元素，sizeof(*a)就是第一个元素的大小-4
//	printf("%d\n", sizeof(a + 1));//4/8 a表示数组首元素的地址，a+1数组第二个元素的地址，sizeof(a+1)就是第二个元素的地址的大小
//	printf("%d\n", sizeof(a[1]));//4 计算的是第二个元素的大小
//	printf("%d\n", sizeof(&a));//4/8 &a取出的是数组的地址，数组的地址也是地址呀，是地址大小就是4/8字节
//	printf("%d\n", sizeof(*&a));//16 计算的整个数组的大小 
//	printf("%d\n", sizeof(&a + 1));//4/8 - &a是数组的地址，+1跳过整个数组，产生的4后边位置的地址
//	printf("%d\n", sizeof(&a[0]));//4/8 取出的数组第一个元素的地址
//	printf("%d\n", sizeof(&a[0] + 1));//4/8 数组第二个元素的地址
//
//	return 0;
//}

//由于还没学习结构体，这里告知结构体的大小是20个字节
//struct Test
//{
//	int Num;
//	char* pcName;
//	short sDate;
//	char cha[2];
//	short sBa[4];
//}*p;
////假设p 的值为0x100000。 如下表表达式的值分别为多少？
////已知，结构体Test类型的变量大小是20个字节
//int main()
//{
//	printf("%p\n", p + 0x1);
//	printf("%p\n", (unsigned long)p + 0x1);
//	printf("%p\n", (unsigned int*)p + 0x1);
//	return 0;
//}

int main()
{
	int a[5][5];
	int(*p)[4];
	p = a;
	printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
	return 0;
}